﻿using System;
using System.Runtime.InteropServices;
using 浏览器客户端.Models;
using 浏览器客户端.Models.Interfaces;
using 浏览器客户端.Models.Model;

namespace 德卡T10
{
    public class IcReader : IIcCardReader
    {
        /// <summary>
        /// 读个人身份信息。支持卡片：二代身份证、外国人居留证、社保卡、健康卡
        /// </summary>
        /// <param name="iType">类型选择:0-自动匹配; 1-身份证; 2-社保卡; 3-健康卡; 4-外国人居留证</param>
        /// <param name="iCreatePhoto">是否生成身份证照片文件:(默认不生成): 0-不生成; 1-生成 tmp.bmp; 2-生成 tmp.jpg</param>
        /// <param name="info">
        /// 成功：个人身份信息
        /// 不是外国人居留证时返回数据：
        ///     姓名|性别|民族|出生日期|地址|身份证号|发卡日期|有效日期|签发机关|照片BASE64|
        /// 外国人居留证返回数据：
        ///     英文名|中文姓名|性别|国籍|出生日期|永久居留证号码|证件签发日期|证件终止日期|当次申请受理机关代码|证件版本号|证件类型标识|预留项|照片 BASE64|
        /// 失败：错误描述信息
        /// </param>
        /// <returns>
        /// 成功：1-身份证; 2-社保卡; 3-健康卡; 4-外国人居留证
        /// 失败：返回小于 0 的错误码。
        /// </returns>
        [DllImport("DC_Reader.dll", EntryPoint = "iReadIdentityCard")]
        internal static extern Int32 ReadCard(int iType, ref byte info, int iCreatePhoto);


        /// <summary>
        /// 读取社保卡发卡信息，包含卡号信息
        /// </summary>
        /// <param name="info">
        /// 成功：3F00EF05 信息
        /// 3F00EF05 信息返回数据格式为：
        /// 卡识别码|卡类别|卡规范版本|初始化机构编号|发卡日期|卡有效期|卡号|
        /// 失败：错误描述信息
        /// </param>
        /// <returns>
        /// 成功：返回 0；
        /// 失败：返回小于 0 的错误码。
        /// </returns>
        [DllImport("DC_Reader.dll", EntryPoint = "iReadSIEF05")]
        internal static extern Int32 iReadSIEF05(ref byte info);

        /// <summary>
        /// 获取社保卡号
        /// </summary>
        /// <returns></returns>
        private static string GetSheBaoCardNo()
        {
            byte[] bytes = new byte[10240];
            var result = iReadSIEF05(ref bytes[0]);
            if (result == 0)
            {
                var content = System.Text.Encoding.Default.GetString(bytes).Replace("\0", "").Trim();
                string[] array = content.Split('|');
                var cardNo = array[0].Substring(0, 6) + array[6];
                return cardNo;
            }
            return null;
        }


        public Patient ReadCard()
        {
            var info = new Patient();
            try
            {
                byte[] bytes = new byte[10240];
                var result = ReadCard(2, ref bytes[0], 0);
                if (result == 2)
                {
                    info.IcCardNo = GetSheBaoCardNo();
                    if (string.IsNullOrWhiteSpace(info.IcCardNo)) return null;
                    var content = System.Text.Encoding.Default.GetString(bytes).Replace("\0", "").Trim();
                    string[] array = content.Split('|');
                    info.Name = array[0].Trim();
                    info.IdCardNo = array[5].Trim();
                    info.Address = array[4].Trim();
                    info.MinZu = array[2].Trim();
                    info.CardType = CardTypeEnum.二代医保卡;
                    return info;
                }
                return null;
            }
            catch (Exception ex)
            {
                throw new Exception("IC卡读取失败", ex);
            }
        }
    }
}
